import javaobj
import redis


class RedisUtil:

    def __init__(self,host,pwd,port=6379,decode_responses=False,db=0):
        self.pool = redis.ConnectionPool(
            host=host,
            port=port,
            password=pwd,
            decode_responses=decode_responses,
            db=db
        )
        self.r = redis.Redis(connection_pool=self.pool)
    def get(self,key):
        # 首先得到这个key对应的数据类型
        type = self.r.type(key).decode('utf-8')
        # 根据类型选择不同的获取数据的方法，并返回
        if type == 'string':
            return self.r.get(key)
        elif type == 'hash':
            return self.r.hgetall(key)
        elif type == 'list':
            return self.r.lrange(key,0,-1)
        elif type == 'set':
            return self.r.smembers(key)
        elif type == 'zset':
            return self.r.zrange(key,0,-1)
        else:
            raise Exception(f'{key}对应的数据类型不支持')
if __name__ == '__main__':
    redis_util = RedisUtil(
        host='59.36.173.55',
        pwd='mtx'
    )
    # res = redis_util.get('{BUY_NOW_ORIGIN_DATA_PREFIX}_59')
    # # 得到的结果是java序列化数据，我们需要将其转成python对象才能解析其中内容
    # # 使用javaobj来加载res
    # res_py = javaobj.loads(res)
    # # 看一下res_py的类型是什么
    # print(type(res_py))  # 这玩意其实就是python里的列表
    # sku_info = res_py[0]  # 得到列表中第一个产品对象
    # # 这个sku_info对象都有哪些属性信息，可以用dir来获取，也可以通过和开发沟通得到相关的业务属性
    # print(dir(sku_info))
    # print(sku_info.__getattribute__('goodsName'))
    # print(sku_info.__getattribute__('skuId'))
    # print(sku_info.__getattribute__('num'))


    # 针对设置收货地址对应的缓存做操作,他的缓存数据是hash类型，对应的就是python的字典
    res = redis_util.get('{CHECKOUT_PARAM_ID_PREFIX}_89540')
    for key,value in res.items():
        print(f'{key}:{value}')
        # 通过javaobj去转换key和value
        key = javaobj.loads(key)
        try:
            value = javaobj.loads(value)
        except:
            pass
        print(f'{key}:{value}')

        # 支付类型在这里他对应的是一个对象，并不是明文
        if key=='paymentType':
            print(dir(value))
            print(value.__getattribute__('constant'))